/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package org.dahg.project.web;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import org.dahg.project.controller.model.Categoria;
import org.dahg.project.controller.model.Producto;
import org.dahg.project.controller.model.exceptions.ControllerException;
import org.dahg.project.controller.model.services.local.CategoriaService;
import org.dahg.project.controller.model.services.local.MenuService;
import org.dahg.project.controller.model.services.local.ProductoService;
import org.primefaces.event.RowEditEvent;

/**
 *
 * @author dahg
 */
@ManagedBean
@ViewScoped
public class ProductosBean extends AbstractWebBean {
    
    @EJB
    private MenuService menuService;
    @EJB
    private CategoriaService categoriaService;
    @EJB
    private ProductoService productoService;
    
    @ManagedProperty("#{comidaBean}")
    private ComidaBean comidaBean;
    
    private List<Categoria> categorias;
    private List<Producto> productos;
    
    private String nuevaCategoria;
    private String nuevoProducto;
    private Double precio;
    
    private Categoria selected;
    
    @PostConstruct
    public void refresh() {
        if(categorias!=null) {
            categorias.clear();
            categorias.addAll(menuService.getAllCategorias());           
        }
        else
            categorias=menuService.getAllCategorias();
        
        productos=new ArrayList<Producto>();
        if(categorias!=null && !categorias.isEmpty())
            productos.addAll(categorias.get(0).getProducts());
        
    }

    public String saveCategoria() {
        Categoria c=new Categoria();
        c.setDescripcion(nuevaCategoria);
        try {
            categoriaService.persist(c);
            nuevaCategoria="";
            refresh();
            addInfo("Guardada nueva categoria");            
        } catch (ControllerException ex) {
            addError(ex.getMessage());
        }
        return null;
    }
    
    public String removeCategoria(Categoria c) {
        if(!c.getProducts().isEmpty()) {
            addError("La categoria tiene asociado productos");
            return null;
        }
        categoriaService.remove(c);
        refresh();
        addInfo("Eliminada categoria");
        
        return null;
    }
    
    public void onRowEditCategoria(RowEditEvent evt) {
        Categoria c = (Categoria) evt.getObject();
        categoriaService.merge(c);
        addInfo("Categoria actualizada");
    }
    
    public String saveProducto() {
        boolean error=false;
        if(selected==null) {
            addError("No ha seleccionado una categoria");
            error=true;
        }
        
        if(precio==null) {
            addError("No ha introducido precio");
            error=true;
        }
        
        if(error) return null;
        
        
        Producto p = new Producto();
        p.setCategoria(selected);
        p.setPrecio(precio);
        p.setDescripcion(nuevoProducto);
        
        
        try {
            productoService.persist(p);
            precio=0d;
            nuevoProducto="";
            comidaBean.refresh();
            addInfo("Producto creado");
        } catch (ControllerException ex) {
            addError(ex.getMessage());
        }
        
        return null;
    }
    
    public List<Categoria> getCategorias() {
        return categorias;
    }

    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
    }

    public List<Producto> getProductos() {
        return productos;
    }

    public void setProductos(List<Producto> productos) {
        this.productos = productos;
    }

    public String getNuevaCategoria() {
        return nuevaCategoria;
    }

    public void setNuevaCategoria(String nuevaCategoria) {
        this.nuevaCategoria = nuevaCategoria;
    }

    public String getNuevoProducto() {
        return nuevoProducto;
    }

    public void setNuevoProducto(String nuevoProducto) {
        this.nuevoProducto = nuevoProducto;
    }

    public Categoria getSelected() {
        return selected;
    }

    public void setSelected(Categoria selected) {
        this.selected = selected;
    }

    public CategoriaService getCategoriaService() {
        return categoriaService;
    }

    public Double getPrecio() {
        return precio;
    }

    public void setPrecio(Double precio) {
        this.precio = precio;
    }

    public void setComidaBean(ComidaBean comidaBean) {
        this.comidaBean = comidaBean;
    }
    
    
}
